<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        // 函数优化
        // 1 函数参数默认值
        // //在 ES6 以前，我们无法给一个函数参数设置默认值，只能采用变通写法：
        function add(a, b) {
            // 判断 b 是否为空，为空就给默认值1
            b = b || 1;
            return a + b
        }
        console.log("ES6之前的求和：" + add(3)); // ES6之前的求和：4

        function add2(a, b = 1) {
            return a + b;
        }
        console.log("ES6之后的求和,b默认值：", add2(3)); // ES6之后的求和,b默认值： 4
        console.log("ES6之后的求和：", add2(3, 4)); // ES6之后的求和： 7

        // 2 不定参数
        function multiParam(...num) {
            let sum = 0;
            num.forEach(item => sum += item)
            return sum;
        }
        console.log("ES6不定参数求和：", multiParam(1, 2, 3, 4)); // ES6不定参数求和： 10

        // 3 箭头函数
        // 一个参数时：
        function fun1(obj) {
            console.log("方法1执行：", obj);
        }
        fun1("泥嚎啊"); // 方法1执行： 泥嚎啊

        let fun2 = obj => console.log("方法2执行：", obj);
        fun2("泥嚎啊") // 方法2执行： 泥嚎啊

        // 两个参数的情况：
        function fun3(a, b = 2) {
            console.log("方法3执行：", a, b);
        }
        fun3(1); // 方法3执行： 1 2

        let fun4 = (a, b = 2) => console.log("方法4执行：", a, b);
        fun4(5); // 方法4执行： 5 2
        fun4(5, 6); // 方法4执行： 5 6

        // 结果存在多行，要使用括弧号强调作用域，这个就和 java 中的 Lambda 表达式差不多
        let fun5 = (a, b = 2) => {
            let sum = a + b;
            console.log("方法5执行了：", sum);
        };
        // 调用
        fun5(4, 5); // 方法5执行了： 9

        // 需求，声明一个对象，hello 方法需要对象的个别属性
        let personJack = {
            "name": "Jack",
            "age": 23,
            "addr": "sz"
        }
        // ES6 之前的方法声明方式
        function personFun1(person) {
            console.log("人的姓名为：", person.name);
        }
        personFun1(personJack); // 人的姓名为： Jack

        // ES6之后
        let personFun2 = person => console.log("人的姓名为：", person.name);
        personFun2(personJack); // 人的姓名为： Jack
        // 对象解构以及箭头函数
        let personFun3 = ({name:userName}) => console.log("人的姓名为：", userName);
        personFun3(personJack) // 人的姓名为： Jack

    </script>
</body>

</html>